/**
 * 
 */
package com.ms.game.itembox.container;

import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ms.game.common.container.BasicBinUtil;
import com.ms.game.invitefriend.bin.ItemInfo;
import com.xpec.c4.game.utility.GameUtility;

/**
 * 方便從 {@link ItemBoxBin} 取資料的工具
 * 
 * @author TW15010
 */
public class ItemBoxBinUtil extends BasicBinUtil {
	private static final Log log = LogFactory.getLog(ItemBoxBinUtil.class);

	/**
	 * 取得指定的道具
	 * 
	 * @param itemId
	 *            道具id
	 * @return 道具資料
	 */
	public static ItemBasic getItem(String itemId) {
		return ItemBoxBin.getInstance().getItemMap().get(itemId);
	}

	/**
	 * 確認道具是否存在
	 * 
	 * @param itemId
	 *            item id
	 * @return 存在: true<br>
	 *         不存在: false
	 */
	public static boolean isItemExist(String itemId) {
		if (ItemBoxBin.getInstance().getItemMap().get(itemId) != null) {
			return true;
		}

		return false;
	}

	@Override
	public void onBinLoad(Object binInstance) {
		if (!(binInstance instanceof ItemBoxBin)) {
			return;
		}

//		ItemBoxBin bin = (ItemBoxBin) binInstance;
//
//		HashMap<String, ItemBasic> itemMap = bin.getItemMap();
//
//		// 掃描所有的道具
//		for (Map.Entry<String, ItemBasic> entry : itemMap.entrySet()) {
//			ItemBasic item = entry.getValue();
//
//			// 可堆疊的道具不能有精煉相關條件
//			if (item.isStackable()) {
//				if (item.getRefineExpireTime() > 0
//						|| GameUtility.getArrayListSize(item.getRefineCrystalCostList()) > 0) {
//					if (log.isErrorEnabled()) {
//						log.error("item [" + item.getItemId() + "] stackable item can't set refine info.");
//					}
//				}
//			}

			// 精煉水晶需求的內容必須是數字
//			if (GameUtility.getArrayListSize(item.getRefineCrystalCostList()) > 0) {
//				for (int needCrystalCountStr : item.getRefineCrystalCostList()) {
//					if (!GameUtility.isNumeric(needCrystalCountStr)) {
//						if (log.isErrorEnabled()) {
//							log.error("item [" + item.getItemId() + "] refine crystal cost list must be number.");
//						}
//					}
//				}
//			}

			// 找出禮包類型的道具
//			if (item instanceof ItemBonusPack) {
//				ItemBonusPack bonusPack = (ItemBonusPack) item;
//
//				// 檢查裡面指定的道具 id 是否存在
//				verifyItemList(bonusPack.getRandomItemList());
//			}
//		}
	}

	/**
	 * 檢查道具清單內的道具 id 是否存在於 {@link ItemBoxBin}
	 * 
	 * @param itemList
	 *            道具清單
	 */
	public static void verifyItemList(ArrayList<ItemInfo> itemList) {
		ItemBoxBin bin = ItemBoxBin.getInstance();

		if (bin == null) {
			return;
		}

		if (itemList == null) {
			return;
		}

		for (ItemInfo info : itemList) {
			String itemId = info.getItemId();
			if (!isItemExist(itemId)) {
				if (log.isErrorEnabled()) {
					log.error("item [" + itemId + "] is not exist in " + bin.getClass().getSimpleName());
				}
			}
		}
	}
	
	/**
	 * 檢查道具是否能被精煉
	 * 
	 * @param itemBin
	 *            道具數據資料
	 * @return
	 */
	public static boolean isItemCanRefine(ItemBasic itemBin) {
		if (itemBin == null) {
			return false;
		}

		// 精煉資訊列表為 0 就是不能精煉
		if (GameUtility.getArrayListSize(itemBin.getRefineCrystalCostList()) == 0) {
			return false;
		}

		return true;
	}
	
	public static final int GET_NEED_CRYSTAL_FAIL = -1;
	
	/**
	 * 取得精煉到下一級需要的水晶數量
	 * 
	 * @param currentLevel
	 *            目前精煉等級
	 * @param itemBin
	 *            道具數據
	 * @return 成功: 需要的水晶數量<br>
	 *         失敗: {@link #GET_NEED_CRYSTAL_FAIL}
	 */
	public static int getRefineNeedCrystal(int currentLevel, ItemBasic itemBin) {
		if (itemBin == null) {
			return GET_NEED_CRYSTAL_FAIL;
		}

		// 不能精煉
		int refineLevelCount = GameUtility.getArrayListSize(itemBin.getRefineCrystalCostList());
		if (refineLevelCount == 0) {
			return GET_NEED_CRYSTAL_FAIL;
		}

		if (currentLevel < 0) {
			return GET_NEED_CRYSTAL_FAIL;
		}

		// 超過最高等級
		if (currentLevel >= refineLevelCount) {
			return GET_NEED_CRYSTAL_FAIL;
		}

		// 取得精煉需要的數量
		int refineCrystalCost = itemBin.getRefineCrystalCostList().get(currentLevel);

		return refineCrystalCost;
	}

	/**
	 * 道具精煉期過了沒有
	 * 
	 * @param itemRefineEndTime
	 *            道具上記錄的過期時間
	 * @param currentTime
	 *            目前時間
	 * @return
	 */
	public static boolean isRefineTimeExpire(long itemRefineEndTime, long currentTime) {
		if (itemRefineEndTime > 0) {
			if (currentTime > itemRefineEndTime) {
				return true;
			}
		}

		return false;
	}
}